# 装饰器

# 装饰器（decorators）是 Python 中的一种高级功能，它允许你动态地修改函数或类的行为。
# 装饰器是一种函数，它接受一个函数作为参数，并返回一个新的函数或修改原来的函数。
# 除了自定义装饰器外，python还提供了一些内置的装饰器，如@classmethod，@staticmethod，@property等。

# Python 装饰允许在不修改原有函数代码的基础上，动态地增加或修改函数的功能，装饰器本质上是一个接收函数作为输入并返回一个新的包装过后的函数的对象。

# 将原函数作为一个参数传递进来，
def decorator_function(original_function):
    def wrapper(*args, **kwargs):
        # 这里是在调用原始函数前添加的新功能，参数要和原函数保持一致
        # before_call_code()
        print("原函数处理逻辑前执行")

        result = original_function(*args, **kwargs)

        # 这里是在调用原始函数后添加的新功能
        # after_call_code()
        print("原函数处理逻辑后执行")

        return result

    return wrapper

# 返回的wrapper是一个新的函数，它对原函数进行了包装，也就是功能的增强，类似于java中的代理

# @decorator_function
# def target_function(arg1, arg2):
#     # 原始函数的实现
#     print("原函数处理逻辑" + arg1 + " " + arg2)


# 这种操作等同于
def target_function(arg1, arg2):
    # 原始函数的实现
    print("原函数处理逻辑" + arg1 + " " + arg2)

# 本质这里返回了一个新的函数，但是为了避免重复定义，直接将返回值赋值给原函数
target_function = decorator_function(target_function)

target_function("nihao", "hello")

# 除了函数装饰器，Python 还支持类装饰器。类装饰器是包含 __call__ 方法的类，它接受一个函数作为参数，并返回一个新的函数。
class DecoratorClass:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        # 在调用原始函数之前/之后执行的代码
        print("在调用原始函数之前执行的代码")

        result = self.func(*args, **kwargs)

        # 在调用原始函数之后执行的代码
        print("在调用原始函数之前执行的代码")

        return result


@DecoratorClass
def my_function():
    pass







